/*
	kconnect.c 2010
	Wraped by Pham The Chung
*/
#ifndef __X86_64_KCONNECT_H_
#define __X86_64_KCONNECT_H_

/*
 * This file contains the system call numbers.
 *
 * Note: holes are not allowed.
 */

/* at least 8 syscall per cacheline */
#define __NR_read                                0
#define __NR_write                               1
#define __NR_open                                2
#define __NR_close                               3
#define __NR_stat                                4
#define __NR_fstat                               5
#define __NR_lstat                               6
#define __NR_poll                                7

#define __NR_lseek                               8
#define __NR_mmap                                9
#define __NR_mprotect                           10
#define __NR_munmap                             11
#define __NR_brk                                12
#define __NR_rt_sigaction                       13
#define __NR_rt_sigprocmask                     14
#define __NR_rt_sigreturn                       15

#define __NR_ioctl                              16
#define __NR_pread64                            17
#define __NR_pwrite64                           18
#define __NR_readv                              19
#define __NR_writev                             20
#define __NR_access                             21
#define __NR_pipe                               22
#define __NR_select                             23

#define __NR_sched_yield                        24
#define __NR_mremap                             25
#define __NR_msync                              26
#define __NR_mincore                            27
#define __NR_madvise                            28
#define __NR_shmget                             29
#define __NR_shmat                              30
#define __NR_shmctl                             31

#define __NR_dup                                32
#define __NR_dup2                               33
#define __NR_pause                              34
#define __NR_nanosleep                          35
#define __NR_getitimer                          36
#define __NR_alarm                              37
#define __NR_setitimer                          38
#define __NR_getpid                             39

#define __NR_sendfile                           40 /*not difference between sendfile{,64}*/
#define __NR_socket                             41
#define __NR_connect                            42
#define __NR_accept                             43
#define __NR_sendto                             44
#define __NR_recvfrom                           45
#define __NR_sendmsg                            46
#define __NR_recvmsg                            47

#define __NR_shutdown                           48
#define __NR_bind                               49
#define __NR_listen                             50
#define __NR_getsockname                        51
#define __NR_getpeername                        52
#define __NR_socketpair                         53
#define __NR_setsockopt                         54
#define __NR_getsockopt                         55

#define __NR_clone                              56
#define __NR_fork                               57
#define __NR_vfork                              58
#define __NR_execve                             59
#define __NR_exit                               60
#define __NR_wait4                              61
#define __NR_kill                               62
#define __NR_uname                              63

#define __NR_semget                             64
#define __NR_semop                              65
#define __NR_semctl                             66
#define __NR_shmdt                              67
#define __NR_msgget                             68
#define __NR_msgsnd                             69
#define __NR_msgrcv                             70
#define __NR_msgctl                             71

#define __NR_fcntl                              72
#define __NR_flock                              73
#define __NR_fsync                              74
#define __NR_fdatasync                          75
#define __NR_truncate                           76
#define __NR_ftruncate                          77
#define __NR_getdents                           78
#define __NR_getcwd                             79

#define __NR_chdir                              80
#define __NR_fchdir                             81
#define __NR_rename                             82
#define __NR_mkdir                              83
#define __NR_rmdir                              84
#define __NR_creat                              85
#define __NR_link                               86
#define __NR_unlink                             87

#define __NR_symlink                            88
#define __NR_readlink                           89
#define __NR_chmod                              90
#define __NR_fchmod                             91
#define __NR_chown                              92
#define __NR_fchown                             93
#define __NR_lchown                             94
#define __NR_umask                              95

#define __NR_gettimeofday                       96
#define __NR_getrlimit                          97
#define __NR_getrusage                          98
#define __NR_sysinfo                            99
#define __NR_times                             100
#define __NR_ptrace                            101
#define __NR_getuid                            102
#define __NR_syslog                            103

/* at the very end the stuff that never runs during the benchmarks */
#define __NR_getgid                            104
#define __NR_setuid                            105
#define __NR_setgid                            106
#define __NR_geteuid                           107
#define __NR_getegid                           108
#define __NR_setpgid                           109
#define __NR_getppid                           110
#define __NR_getpgrp                           111
#define __NR_setsid                            112
#define __NR_setreuid                          113
#define __NR_setregid                          114
#define __NR_getgroups                         115
#define __NR_setgroups                         116
#define __NR_setresuid                         117
#define __NR_getresuid                         118
#define __NR_setresgid                         119

#define __NR_getresgid                         120
#define __NR_getpgid                           121
#define __NR_setfsuid                          122
#define __NR_setfsgid                          123
#define __NR_getsid                            124
#define __NR_capget                            125
#define __NR_capset                            126

#define __NR_rt_sigpending                     127
#define __NR_rt_sigtimedwait                   128
#define __NR_rt_sigqueueinfo                   129
#define __NR_rt_sigsuspend                     130
#define __NR_sigaltstack                       131
#define __NR_utime                             132
#define __NR_mknod                             133

/* Only needed for a.out */
#define __NR_uselib                            134
#define __NR_personality                       135

#define __NR_ustat                             136
#define __NR_statfs                            137
#define __NR_fstatfs                           138
#define __NR_sysfs                             139

#define __NR_getpriority                       140
#define __NR_setpriority                       141
#define __NR_sched_setparam                    142
#define __NR_sched_getparam                    143
#define __NR_sched_setscheduler                144
#define __NR_sched_getscheduler                145
#define __NR_sched_get_priority_max            146
#define __NR_sched_get_priority_min            147
#define __NR_sched_rr_get_interval             148

#define __NR_mlock                             149
#define __NR_munlock                           150
#define __NR_mlockall                          151
#define __NR_munlockall                        152

#define __NR_vhangup                           153

#define __NR_modify_ldt                        154

#define __NR_pivot_root                        155

#define __NR__sysctl                           156

#define __NR_prctl                             157
#define __NR_arch_prctl                        158

#define __NR_adjtimex                          159

#define __NR_setrlimit                         160

#define __NR_chroot                            161

#define __NR_sync                              162

#define __NR_acct                              163

#define __NR_settimeofday                      164

#define __NR_mount                             165
#define __NR_umount2                           166

#define __NR_swapon                            167
#define __NR_swapoff                           168

#define __NR_reboot                            169

#define __NR_sethostname                       170
#define __NR_setdomainname                     171

#define __NR_iopl                              172
#define __NR_ioperm                            173

#define __NR_create_module                     174
#define __NR_init_module                       175
#define __NR_delete_module                     176
#define __NR_get_kernel_syms                   177
#define __NR_query_module                      178
#define __NR_quotactl                          179

#define __NR_nfsservctl                        180

#define __NR_getpmsg                           181	/* reserved for LiS/STREAMS */
#define __NR_putpmsg                           182	/* reserved for LiS/STREAMS */

#define __NR_afs_syscall                       183	/* reserved for AFS */ 

#define __NR_tuxcall      		184 /* reserved for tux */

#define __NR_security			185

#define __NR_gettid		186

#define __NR_readahead		187
#define __NR_setxattr		188
#define __NR_lsetxattr		189
#define __NR_fsetxattr		190
#define __NR_getxattr		191
#define __NR_lgetxattr		192
#define __NR_fgetxattr		193
#define __NR_listxattr		194
#define __NR_llistxattr		195
#define __NR_flistxattr		196
#define __NR_removexattr	197
#define __NR_lremovexattr	198
#define __NR_fremovexattr	199
#define __NR_tkill	200
#define __NR_time      201
#define __NR_futex     202
#define __NR_sched_setaffinity    203
#define __NR_sched_getaffinity     204
#define __NR_set_thread_area	205
#define __NR_io_setup	206
#define __NR_io_destroy	207
#define __NR_io_getevents	208
#define __NR_io_submit	209
#define __NR_io_cancel	210
#define __NR_get_thread_area	211
#define __NR_lookup_dcookie	212
#define __NR_epoll_create	213
#define __NR_epoll_ctl_old	214
#define __NR_epoll_wait_old	215
#define __NR_remap_file_pages	216
#define __NR_getdents64		217
#define __NR_set_tid_address	218
#define __NR_restart_syscall	219
#define __NR_semtimedop		220
#define __NR_fadvise64		221
#define __NR_timer_create	222
#define __NR_timer_settime	223
#define __NR_timer_gettime	224
#define __NR_timer_getoverrun	225
#define __NR_timer_delete	226
#define __NR_clock_settime	227
#define __NR_clock_gettime	228
#define __NR_clock_getres	229
#define __NR_clock_nanosleep	230
#define __NR_exit_group		231
#define __NR_epoll_wait		232
#define __NR_epoll_ctl		233
#define __NR_tgkill		234
#define __NR_utimes		235
#define __NR_vserver		236
#define __NR_mbind 		237
#define __NR_set_mempolicy 	238
#define __NR_get_mempolicy 	239
#define __NR_mq_open 		240
#define __NR_mq_unlink 		241
#define __NR_mq_timedsend 	242
#define __NR_mq_timedreceive	243
#define __NR_mq_notify 		244
#define __NR_mq_getsetattr 	245
#define __NR_kexec_load 	246
#define __NR_waitid		247
#define __NR_add_key		248
#define __NR_request_key	249
#define __NR_keyctl		250
#define __NR_ioprio_set				251
#define __NR_ioprio_get				252
#define __NR_inotify_init			253
#define __NR_inotify_add_watch			254
#define __NR_inotify_rm_watch			255
#define __NR_migrate_pages			256
#define __NR_openat				257
#define __NR_mkdirat				258
#define __NR_mknodat				259
#define __NR_fchownat				260
#define __NR_futimesat				261
#define __NR_newfstatat				262
#define __NR_unlinkat				263
#define __NR_renameat				264
#define __NR_linkat				265
#define __NR_symlinkat				266
#define __NR_readlinkat				267
#define __NR_fchmodat				268
#define __NR_faccessat				269
#define __NR_pselect6				270
#define __NR_ppoll				271
#define __NR_unshare				272
#define __NR_set_robust_list			273
#define __NR_get_robust_list			274
#define __NR_splice				275
#define __NR_tee				276
#define __NR_sync_file_range			277
#define __NR_vmsplice				278
#define __NR_move_pages				279
#define __NR_utimensat				280
#define __IGNORE_getcpu		/* implemented as a vsyscall */
#define __NR_epoll_pwait			281
#define __NR_signalfd				282
#define __NR_timerfd_create			283
#define __NR_eventfd				284
#define __NR_fallocate				285
#define __NR_timerfd_settime			286
#define __NR_timerfd_gettime			287
#define __NR_accept4				288
#define __NR_signalfd4				289
#define __NR_eventfd2				290
#define __NR_epoll_create1			291
#define __NR_dup3				292
#define __NR_pipe2				293
#define __NR_inotify_init1			294
#define __NR_preadv				295
#define __NR_pwritev				296
#define __NR_rt_tgsigqueueinfo			297
#define __NR_perf_event_open			298
/*
	int $0x80 a bcdSDB
	syscall   a DSd r10 r8 r9
	x86-64 convention DSdc r8 r9
*/
/*
	KCONNECT use default 3 arg
	3 argument use for open read write ioctl
	to know shape of function use callshape.h
*/
#define KCONNECT(name,arg1,arg2,arg3) \
			__asm__("syscall"\
			::"a"(__NR_##name), \
			"D"((long)arg1),"S"((long)arg2),"d"((long)arg3)); 

#define KCONNECT0(name) \
			__asm__("syscall"::"a"(__NR_##name)); 
#define KCONNECT1(name,arg) \
			__asm__("syscall"::"a"(__NR_##name),"D"(arg) );
#define KCONNECT2(name,arg1,arg2) \
			__asm__("syscall" \
			::"a"(__NR_##name),"D"(arg1),"S"(arg2) );
#define KCONNECT3(name,arg1,arg2,arg3) \
			__asm__("syscall"\
			::"a"(__NR_##name),"D"(arg1),"S"(arg2),"d"(arg3)); 
#define KCONNECT4(name,arg1,arg2,arg3,arg4) \
			__asm__("mov %4,%%r10,syscall"\
			::"a"(__nR_##name), \
			"D"(arg1),"S"(arg2),"d"(arg3),"m"(arg4));
#define KCONNECT5(name,a1,a2,a3,a4,a5)  \
		__asm__("mov %4,%%r10;mov %5,%%r8;syscall;"\
		::"a"(__NR_##name), \
		"D"(a1),"S"(a2),"d"(a3),"m"(a4),"m"(a5) );
#define KCONNECT6(name,a1,a2,a3,a4,a5,a6) \
		__asm__("mov %4,%%r10;mov %4,%%r8;mov %6,%%r9;syscall;"\
		::"a"(__NR_##name),\
		"D"(a1),"S"(a2),"d"(a3),"m"(a4),"m"(a5),"m"(a6));
/*
	SYSCALL defination macro
*/
#define KCALLDEF(z) KCALLDEF3(z)
#define TRANS_FNAME(Z) __##Z##_
#define FUNC_ASM	__asm__
#define CALL_SYS(name,par) __##name##_ par
#define CALL_RET long
/*how to trans _name_ to name*/

#define KCALLDEF0(tf,funcname)\
	tf TRANS_FNAME(funcname) (void){ \
		FUNC_ASM ("syscall"::"a"(__NR_##funcname));\
	}
#define KCALLDEF1( rt,funcname,type,arg ) \
	rt TRANS_FNAME(funcname) ( type arg ) \
	{ \
		FUNC_ASM ("syscall"::"a"(__NR_##funcname),"D"(arg) );\
	}
#define KCALLDEF2( rt,funcname,t1,a1,t2,a2) \
	rt TRANS_FNAME(funcname)( t1 a1,t2 a2 ) \
	{ \
		FUNC_ASM ("syscall"::"a"(__NR_##funcname),"D"(a1),"S"(a2));\
	}
#define KCALLDEF3(tf,name,t1,a1,t2,a2,t3,a3) \
	tf TRANS_FNAME(name)( t1 a1,t2 a2,t3 a3 ) { \
		FUNC_ASM ("syscall" \
		::"a"(__NR_##name), \
		"D"(a1),"S"(a2),"d"(a3) ); \
	}
#define KCALLDEF4(tf,name,t1,a1,t2,a2,t3,a3,t4,a4) \
	tf TRANS_FNAME(name)( t1 a1,t2 a2,t3 a3,t4 a4 ) \
	{ \
		FUNC_ASM ("mov %4,%%r10;syscall" \
		::"a"(__NR_##name), \
		"D"(a1),"S"(a2),"d"(a3),"m"(a4)); \
	}
#define KCALLDEF5(tf,name,t1,a1,t2,a2,t3,a3,t4,a4,t5,a5) \
	tf TRANS_FNAME(name)(t1 a1,t2 a2,t3 a3,t4 a4,t5 a5) \
	{ \
		__asm__(" \
		mov %4,%%r10;mov %5,%%r8; \
		syscall; " \
		:: \
		"a"(__NR_##name), \
		"D"(a1),"S"(a2),"d"(a3),"m"(a4),"m"(a5)); \
	}
#define KCALLDEF6(tf,name,t1,a1,t2,a2,t3,a3,t4,a4,t5,a5,t6,a6) \
	tf TRANS_FNAME(name)( t1 a1,t2 a2,t3 a3,t4 a4,t5 a5,t6 a6 ) \
	{ \
		FUNC_ASM (" \
		mov %4,%%r10;mov %5,%%r8;mov %6,%%r9; \
		syscall;" \
		::"a"(__NR_##name),\
		"D"(a1),"S"(a2),"d"(a3), \
		"m"(a4),"m"(a5),"m"(a6) );\
	}
#define SYSCALL_DEFINE0(name) \
	KCALLDEF0(CALL_RET,name)
#define SYSCALL_DEFINE1(name,type,arg) \
	KCALLDEF1(CALL_RET,name,type,arg)
#define SYSCALL_DEFINE2(name,t1,a1,t2,a2) \
	KCALLDEF2(CALL_RET,name,t1,a1,t2,a2)
#define SYSCALL_DEFINE3(name,t1,a1,t2,a2,t3,a3) \
	KCALLDEF3(CALL_RET,name,t1,a1,t2,a2,t3,a3)
#define SYSCALL_DEFINE4(name,t1,a1,t2,a2,t3,a3,t4,a4) \
	KCALLDEF4(CALL_RET,name,t1,a1,t2,a2,t3,a3,t4,a4)
#define SYSCALL_DEFINE5(name,t1,a1,t2,a2,t3,a3,t4,a4,t5,a5) \
	KCALLDEF5(CALL_RET,name,t1,a1,t2,a2,t3,a3,t4,a4,t5,a5)
#define SYSCALL_DEFINE6(name,t1,a1,t2,a2,t3,a3,t4,a4,t5,a5,t6,a6)  \
	KCALLDEF6(CALL_RET,name,t1,a1,t2,a2,t3,a3,t4,a4,t5,a5,t6,a6)

#endif

